var express = require('express');
var utils = require('../functions/utils');

var async = require('async');
var facebookRequest = require("request");

var router = express.Router();

router.post('/', function(req,res)
{

/*
	Input parameters 
	 *		isLoginIdFromFacebook 옵션	 0: 입력받음 , 1 : 페이스북으로부터 요놈은 페이스북으로부터 이메일을 받았는지 여부 안받으면 앱에서 입력받음 
								( 왜필요한가하면 패스워드로긴아이디인데 같은 로긴아이디로 페이스북으로 로긴할 수도 있기때문. 그 경우 페이스북에서 온 이메일일경우는 로긴받아주는거고 입력받은 놈일 경우는 에러.)
	 *		loginId			옵션 - facebookid로만 핸들링한다. 
	 *		facebookId
	 *  	facebookToken
*/
	var isLoginIdFromFacebook = req.body.isLoginIdFromFacebook;	//utils.checkParamValue('isLoginIdFromFacebook' , isLoginIdFromFacebook);
	var loginId = req.body.loginId;				//utils.checkParamValue('loginId' , loginId);
	var facebookId = req.body.facebookId;		utils.checkParamValue('facebookId' , facebookId);
	var facebookToken = req.body.facebookToken;	utils.checkParamValue('facebookToken' , facebookToken);

	// 금지어 체크
	utils.checkProhibitedWord(loginId);

	// 값이 넘어왔으면 trim
	if(loginId != null)
	{
		loginId = loginId.replace(/(^\s*)|(\s*$)/gi, "");
		// 길이가 없으면 null
		if(loginId.length == 0)
			loginId = null;
	}

	// session id 없으니 loginId로 대신한다. 
	if(utils.isValidString(loginId))
	{
		req.body.sessionId = loginId;
	}
	else
	{
		req.body.sessionId = facebookId;
	}

	utils.callLog(req);

	var userName = null;
	var domain = null;
	var userKey = null;

	// loginId가 입력되었을 경우...
	if(utils.isValidString(loginId))
	{
		// email check
		if(!utils.emailCheck(loginId))
		{
			var err = new Error('Invalid email address : ' + loginId);
			err.code = '524';
			throw err;
		}

		var _list = loginId.split("@");

		userName = _list[0];
		domain = _list[1];
	}

//////////////////////////////////////////////////////////////////////////////////

		// mail domain check 후 sp call 
		async.waterfall([
			function(cb)
			{
				// 메일이 있을 경우
				if(utils.isValidString(domain))
				{
					// lookup가져오는데 시간이 오래걸리는 domain은 미리 밴다 - 이유는 모르겠음.
					if(domain.toLowerCase() == 'gemail.com')
					{
						utils.setSendMmailInfo(loginId,null);
						utils.errorLog(req , '699' , 'invalid domain : ' + domain);
						cb(null , false);
					}
					else
					{
						var dns = require ('dns');
						dns.resolveMx( domain, function (err, addresses) // mx lookup 해서 
						{
							var validDomain = false;
							// 결과가 있고 exchage server 가 존재할 경우만 true
							if (!err)
							{
								for(var i = 0 ; i < addresses.length ; i ++)
								{
									if(addresses[i].exchange.length > 0)
									{
										validDomain = true;
										break;
									}

								}
							}

							// 없는 dns일 경우는 invalid로 마킹. 
							if (!validDomain)
							{
								utils.setSendMmailInfo(loginId,null);
								utils.errorLog(req , '699' , 'invalid domain : ' + domain);
							}

							cb(null , validDomain);

						}); //dns.resolve4
					} // else gemail
				}
				// 없을때는 걍 넘긴다.
				else
				{
					cb(null , true);
				}
			},
			function(validDomain , cb)
			{
				// facebook invalidation
				var path = global.config.facebook.validation_page + facebookToken;
				// facebook restful api 
				facebookRequest(path, function (error, response, body) 
				{
					if (!error && response && response.statusCode && response.statusCode == 200) 
					{
						var data = JSON.parse(body);

						// 입력된 id와 실제 id가 다를 경우 
						if(facebookId != data.id)
						{
							var err = new Error('Facebook ID mismatch: input(' + facebookId +'), real(' + data.id+')');
							err.code = '550';
							throw err;
						}

						//  insert , update : master
						global.master_db.connection.getConnection(function(err,connection)
						{
							if(err)
							{
								throw err;
							}

							var input_param = [isLoginIdFromFacebook, loginId , facebookId, userName, validDomain];

							var sql = 'call api_loginWithFacebook(? ,? , ? ,? , ? , @key, @result); SELECT @key as userKey , @result AS result';
							var query = connection.query(sql, input_param , function (err, rows) 
							{
								connection.release();
								if(err)
								{
									throw err;
								}

								var ret = { 'body' : {} };	 // 기본값은 성공

								switch(rows[1][0].result)
								{
									case 200:
									case 201:
									case 202:
										ret.code=rows[1][0].result;
										ret.body.userKey=rows[1][0].userKey;
										userKey=rows[1][0].userKey;
										break;
									case 520:
										var err = new Error('Email is in use : ' + loginId);
										err.code = '520';
										throw err;
										break;
									case 551:
										var err = new Error('loginId and Facebook Id mismatch : ' + loginId + ',' + facebookId);
										err.code = '551';
										throw err;
										break;
									default:
										throw new Error();

								}

								res.json(ret);
								res.end();

							}); // call api_loginWithFacebook

						}); // getConnection
					}
					else
					{
						var err = new Error('Invalid Facebook token : ' + facebookToken);
						err.code = '550';
						throw err;
					}

				}); // request facebook 
			}
		]); // waterfall 

//////////////////////////////////////////////////////////////////////////////////



	
});

module.exports = router;